class EventEmitter {
    constructor() {
        this.events = {}
    }
    on(eventName, callback) {
        if (this.events[eventName]) {
            this.events[eventName].push(callback)
        } else {
            this.events[eventName] = [callback]
        }
    }
    emit(eventName) {
        if (this.events[eventName]) {
            this.events[eventName].forEach(callback => {
                callback()
            })
        } else {
            console.log(`没有事件:${eventName}`)
        }
    }
    off(eventName, callback) {
        if (this.events[eventName]) {
            this.events[eventName] = this.events[eventName].filter(cb => cb !== callback)
        } else {
            console.log(`没有事件:${eventName}`)
        }
    }
    // 一次性订阅
    once(eventName, callback) {
        const wrap = () => {
            callback()
            this.off(eventName, wrap)
        }
        this.on(eventName, wrap)
    }
}
// class EventEmitter {
//     constructor() {
//         this.eventList = {
//             // 'hasHouse': [kang, wrap],
//             // 'hasCar': [cheng]
//         }
//     }

//     on(eventName, cb) {
//         if (!this.eventList[eventName]) {
//             this.eventList[eventName] = []
//         }

//         this.eventList[eventName].push(cb)
//     }
//     emit(eventName) {
//         if (this.eventList[eventName]) {
//             const handlers = this.eventList[eventName].slice()   // 
//             handlers.forEach((item) => {
//                 item()
//             })
//         }
//     }
//     off(eventName, cb) {
//         const callbacks = this.eventList[eventName]
//         const index = callbacks.indexOf(cb)
//         if (index !== -1) {
//             callbacks.splice(index, 1)
//         }
//     }
//     once(eventName, cb) {
//         const wrap = () => {
//             cb()
//             this.off(eventName, wrap)
//         }
//         this.on(eventName, wrap)
//     }
// }



let _event = new EventEmitter()

function yang() {
    console.log('我是yang')
}

function xh() {
    console.log('我是xh')
}

// _event.on('has_xh', yang)
// _event.on('has_xh', xh)
// _event.off('has_xh', xh)

// _event.emit('has_xh')

// _event.emit('has_xh')
// _event.emit('has_yang')

_event.once('has_xh', xh)
_event.emit('has_xh')
_event.emit('has_xh')
